uint64_t identpt;
uint64_t vm86_tss;
uint64_t console_pfn;
+ uint64_t acpi_ioport_location;
} pagebuf_t;
static int pagebuf_init(pagebuf_t* buf)
// DPRINTF("last checkpoint indication received");
return pagebuf_get_one(xch, ctx, buf, fd, dom);
+ case XC_SAVE_ID_HVM_ACPI_IOPORTS_LOCATION:
+ /* Skip padding 4 bytes then read the acpi ioport location. */
+ if ( RDEXACT(fd, &buf->acpi_ioport_location, sizeof(uint32_t)) ||
+ RDEXACT(fd, &buf->acpi_ioport_location, sizeof(uint64_t)) )
+ {
+ PERROR("error read the acpi ioport location");
+ return -1;
+ }
+ return pagebuf_get_one(xch, ctx, buf, fd, dom);
+
default:
if ( (count > MAX_BATCH_SIZE) || (count < 0) ) {
ERROR("Max batch size exceeded (%d). Giving up.", count);
fcntl(io_fd, F_SETFL, orig_io_fd_flags | O_NONBLOCK);
}
+ if (pagebuf.acpi_ioport_location == 1) {
+ DBGPRINTF("Use new firmware ioport from the checkpoint\n");
+ xc_set_hvm_param(xch, dom, HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
+ } else if (pagebuf.acpi_ioport_location == 0) {
+ DBGPRINTF("Use old firmware ioport from the checkpoint\n");
+ } else {
+ ERROR("Error, unknow acpi ioport location (%i)", pagebuf.acpi_ioport_location);
+ }
+
if ( ctx->last_checkpoint )
{
// DPRINTF("Last checkpoint, finishing\n");
PERROR("Error when writing the console pfn for guest");
goto out;
}
+
+ chunk.id = XC_SAVE_ID_HVM_ACPI_IOPORTS_LOCATION;
+ xc_get_hvm_param(xch, dom, HVM_PARAM_ACPI_IOPORTS_LOCATION,
+ (unsigned long *)&chunk.data);
+
+ if ((chunk.data != 0) && wrexact(io_fd, &chunk, sizeof(chunk)))
+ {
+ PERROR("Error when writing the firmware ioport version");
+ goto out;
+ }
}
if ( !callbacks->checkpoint )
#define XC_SAVE_ID_TSC_INFO -7
#define XC_SAVE_ID_HVM_CONSOLE_PFN -8 /* (HVM-only) */
#define XC_SAVE_ID_LAST_CHECKPOINT -9 /* Commit to restoring after completion of current iteration. */
+#define XC_SAVE_ID_HVM_ACPI_IOPORTS_LOCATION -10
/*
** We process save/restore/migrate in batches of pages; the below